home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
EnigmA Amiga Run 1995 October
/
EnigmA AMIGA RUN 01 (1995)(G.R. Edizioni)(IT)[!][issue 1995-10][Aminet 7].iso
/
Aminet
/
util
/
cdity
/
cx22.lha
/
CX2.2
/
Quelltext
/
CXCommodity.mod
< prev
next >
Wrap
Text File
|
1995-05-29
|
9KB
|
303 lines
IMPLEMENTATION MODULE CXCommodity;
(* CXCommodity.mod - Brokerroutinen
* Version : $VER: CXCommodity.mod 2.2 (© 1995 Fin Schuppenhauer)
* Autor : Fin Schuppenhauer
* Braußpark 10
* 20537 Hamburg
* (Germany)
* E-Mail : 1schuppe@informatik.uni-hamburg.de
* Erstellt am : 28 Jan 1995
* Letzte Änd. : 29 Mai 1995
*)
(*$ DEFINE DEBUG:=FALSE *)
IMPORT
ed:ExecD, el:ExecL, es:ExecSupport,
cd:CommoditiesD, cl:CommoditiesL, cs:CommoditiesSupport,
ll:LocaleL,
String,
cp:CommoditiesPrivate,
lan:ListsAndNodes,
cxl:CXLokal,
cxw:CXWindow,
cxf:CXFileIO;
FROM SYSTEM IMPORT
ADR, ADDRESS, CAST;
CONST
HOTKEY_DEFAULT = "control alt help";
EVENT_HOTKEY = 1;
YES = "YES";
ON = "ON";
VAR
brokerport: ed.MsgPortPtr;
broker: cd.CxObjPtr;
hotkey: StrPtr;
(* --------------------------------------------------------------- *)
PROCEDURE ExtractArguments;
(* Die übergebenen Argumente und Tooltypes auswerten: *)
VAR
str: StrPtr;
BEGIN
WITH arguments DO
priority := cs.ArgInt(ADR("CX_PRIORITY"), 0);
hotkey := cs.ArgString(ADR("CX_POPKEY"), ADR(HOTKEY_DEFAULT));
str := cs.ArgString(ADR("CX_POPUP"), ADR(YES));
popup := String.Compare(str^, YES) = 0;
END;
END ExtractArguments;
(* --------------------------------------------------------------- *)
PROCEDURE InitBroker (): BOOLEAN;
(* Richtet mein Exchange-Commodity ein. *)
VAR
newbroker: cd.NewBroker;
error: LONGCARD;
filter: cd.CxObjPtr;
bool: BOOLEAN;
str: StrPtr;
success : BOOLEAN;
BEGIN
(* Zunächst muß ein Message-Port für unser Commodity ein-
* gerichtet werden:
*)
success := FALSE;
brokerport := el.CreateMsgPort();
IF brokerport # NIL THEN
(* Na prima, das hat geklappt. Jetzt initialisieren wir
* unseren Broker (sozusagen den Chef unseres Commodities):
*)
WITH newbroker DO
version := cd.nbVersion;
(* Der Name MUSS "Exchange" sein, da wir sonst bestimmte
* Nachrichten (nämlich wenn sich was an den Commodities
* verändert hat) bekommen.
*)
name := ADR("Exchange");
title := ADR("CX V2.2 © 1994/5 Fin Schuppenhauer");
descr := ll.GetCatalogStr(cxw.catalog, cxl.BROKERDESCR, ADR(cxl.BROKERDESCRSTR));;
unique := cd.UniqueFlagSet{cd.unique, cd.notify};
flags := cd.NewBrokerFlagSet{cd.showHide};
pri := arguments.priority;
port := brokerport;
END;
broker := cl.CxBroker(newbroker, error);
IF error = cd.cberrOk THEN
(* Wunderbar. Da unser Commodity über einen Hotkey auch
* erscheinen soll, basteln wir uns das entsprechende
* CxObj dazu:
*)
hotkey := arguments.hotkey;
filter := cs.HotKey(hotkey, brokerport, EVENT_HOTKEY);
IF filter # NIL THEN
cl.AttachCxObj (broker, filter);
(* Wir wollen die dafür notwendige Tastaturkombination
* auch im Fenstertitel anzeigen (ein Teil des Fenster-
* titels wurde bereits in CXWindow.mod definiert):
*)
String.Concat (cxw.wintitle, " <");
String.Concat (cxw.wintitle, hotkey^);
String.ConcatChar (cxw.wintitle, ">");
END;
(* Jetzt ermitteln wir noch schnell das Signal
* für unseren Wait-Aufruf in CX.mod ...
*)
brokersignal := brokerport^.sigBit;
(* ... und aktivieren unseren Broker: *)
bool := cl.ActivateCxObj(broker, TRUE);
(* Falls gewünscht, öffnen wir noch schnell unser
* Fenster:
*)
IF arguments.popup THEN
cxw.ShowWindow;
END;
success := TRUE;
END;
END;
RETURN success;
END InitBroker;
PROCEDURE FreeBroker;
BEGIN
(*$ IF DEBUG *)
io.WriteString ("cxc.FreeBroker()\n");
(*$ ENDIF *)
cl.DeleteCxObjAll(broker);
el.DeleteMsgPort (brokerport);
brokerport := NIL;
END FreeBroker;
(* --------------------------------------------------------------- *)
PROCEDURE InitBrokerList (VAR count: INTEGER);
(* Rückgabewerte:
* list : ListPtr auf die sortierte Liste der Broker
* count : Anzahl der Broker in der Liste
*)
VAR
li: LONGINT;
node: ed.NodePtr;
BEGIN
(*$ IF DEBUG *)
io.WriteString ("cxc.InitBrokerList (");
io.WriteInt (count,0); io.WriteString (") => ");
(*$ ENDIF *)
count := 0;
brokerlist := el.AllocMem(SIZE(ed.List), ed.MemReqSet{ed.public});
IF brokerlist # NIL THEN
es.NewList (brokerlist);
li := cp.CopyBrokerList (brokerlist);
lan.SortExecList(brokerlist, lan.ALLNODES);
count := INTEGER(lan.CountNodes(brokerlist));
END;
(*$ IF DEBUG *)
io.WriteInt (count,0); io.WriteLn;
(*$ ENDIF *)
END InitBrokerList;
PROCEDURE FreeBrokerList;
VAR
count: LONGINT;
BEGIN
(*$ IF DEBUG *)
io.WriteString ("cxc.FreeBrokerList()\n");
(*$ ENDIF *)
IF brokerlist # NIL THEN
count := cp.FreeBrokerList(brokerlist);
el.FreeMem (brokerlist, SIZE(ed.List));
brokerlist := NIL;
END;
END FreeBrokerList;
(* --------------------------------------------------------------- *)
PROCEDURE GetBrokerCopy (num: INTEGER) : cp.BrokerCopyPtr;
VAR
node: ed.NodePtr;
i: INTEGER;
BEGIN
node := brokerlist^.head;
FOR i := 1 TO num DO
node := node^.succ;
END;
RETURN CAST(cp.BrokerCopyPtr, node);
END GetBrokerCopy;
PROCEDURE GetBrokerCopyByName (name: StrPtr) : cp.BrokerCopyPtr;
(* Wird von CXARexx.mod aufgerufen. *)
VAR
node: ed.NodePtr;
BEGIN
node := brokerlist^.head;
WHILE node # NIL DO
IF String.Compare(CAST(cp.BrokerCopyPtr, node)^.name, name^) = 0 THEN
RETURN CAST(cp.BrokerCopyPtr, node);
ELSE
node := node^.succ;
END;
END;
RETURN NIL;
END GetBrokerCopyByName;
PROCEDURE SendBrokerCommand (num: INTEGER; cmd: LONGCARD);
VAR
bc: cp.BrokerCopyPtr;
li: LONGINT;
BEGIN
(*$ IF DEBUG *)
io.WriteString ("cxc.SendBrokerCommand(");
io.WriteInt (num,0); io.Write (","); io.WriteCard(cmd,0);
io.WriteString (")\n");
(*$ ENDIF *)
bc := GetBrokerCopy(num);
IF cmd = activeToggle THEN
IF cp.active IN bc^.flags THEN
cmd := cd.cxcmdDisable;
ELSE
cmd := cd.cxcmdEnable;
END;
END;
li := cp.BrokerCommand (ADR(bc^.name), cmd);
END SendBrokerCommand;
PROCEDURE SendAllBrokerCommand (cmd: LONGCARD);
(* Der Broker-Befehl "cmd" wird an alle Broker verschickt: *)
VAR
bc: cp.BrokerCopyPtr;
li: LONGINT;
BEGIN
bc := CAST(cp.BrokerCopyPtr, brokerlist^.head);
WHILE bc # NIL DO
li := cp.BrokerCommand (ADR(bc^.name), cmd);
bc := CAST(cp.BrokerCopyPtr, bc^.node.succ);
END;
END SendAllBrokerCommand;
(* --------------------------------------------------------------- *)
PROCEDURE HandleBrokerMsg (VAR done: BOOLEAN);
VAR
msg: cd.CxMsgPtr;
msgid: LONGINT;
msgtype: LONGCARD;
bool: BOOLEAN;
BEGIN
(*$ IF DEBUG *)
io.WriteString ("cxc.HandleBrokerMsg()\n");
(*$ ENDIF *)
LOOP
msg := CAST(cd.CxMsgPtr, el.GetMsg (brokerport));
IF msg = NIL THEN EXIT; END;
msgid := cl.CxMsgID(msg);
msgtype := cl.CxMsgType(msg);
el.ReplyMsg (CAST(ADDRESS,msg));
CASE msgtype OF
cd.cxmIevent:
IF msgid = EVENT_HOTKEY THEN
(*$ IF DEBUG *)
io.WriteString ("- Hotkey\n");
(*$ ENDIF *)
cxw.ShowWindow;
END;
| cd.cxmCommand:
(*$ IF DEBUG *)
io.WriteString ("- cxmCommand = ");
io.WriteCard (msgid,0); io.WriteLn;
(*$ ENDIF *)
CASE msgid OF
cd.cxcmdDisable: bool := cl.ActivateCxObj (broker, FALSE);
| cd.cxcmdEnable: bool := cl.ActivateCxObj (broker, TRUE);
| cd.cxcmdKill: done := TRUE;
| cd.cxcmdDisappear: cxw.CloseWindow;
| cd.cxcmdAppear, cd.cxcmdUnique: cxw.ShowWindow;
| cd.cxcmdListChg: cxw.RefreshListview;
ELSE
END;
ELSE
END;
END;
END HandleBrokerMsg;
(* --------------------------------------------------------------- *)
BEGIN (* main *)
ExtractArguments;
END CXCommodity.